let readLine, rl, fs;

/**
 * 文件读写与控制台输入输出工具
 */
const Tool = {input, read, write, createDir};

/**
 * 初始化readLine模块
 */
function initReadLine() {
  //引入readLine模块
  readLine = readLine || require('readline');
  //创建readLine接口实例
  rl = rl || readLine.createInterface({input: process.stdin, output: process.stdout});
}

/**
 * 初始化fs模块
 */
function initFS() {
  //引入fs模块
  fs = fs || require('fs');
}

/**
 * 控制台输入，封装成Promise函数
 * @param inputStrings 需要输入的内容：[string]
 * @param callback 用户输入的结果:([string])=>{}
 */
function input(inputStrings = [], callback = () => null) {
  initReadLine();

  //inputStrings的索引
  let index = 0;
  if (index >= inputStrings.length) {
    return;
  }

  return new Promise(function (resolve, reject) {
    //输出的结果
    let outputStrings = [];

    //设置输入提示
    rl.setPrompt(inputStrings[index++] + ': ');
    //开启输入
    rl.prompt();

    //监听输入事件
    rl.on('line', (line) => {
      outputStrings.push(line.trim());
      if (index >= inputStrings.length) {
        rl.close();
        rl = null;
      } else {
        rl.setPrompt(inputStrings[index++] + ': ');
        rl.prompt();
      }
    }).on('close', () => {
      resolve(outputStrings)
    });

    //超时处理
    setTimeout(() => reject('300秒无操作，自动退出'), 300000);
  });
}

/**
 * 文件读取，从文件中读取Json格式的数据，返回一个对象
 * @param path 这里使用相对路径，相对于工程目录
 * @returns {Promise<string>} 返回Json格式的字符串
 */
function read(path) {
  initFS();

  path = formatPath(path);

  return new Promise((resolve, reject) => {
    fs.readFile(path, (err, data) => {
      if (err) {
        reject(err);
      } else {
        data = typeof(data) == 'object' ? data.toString() : data;
        resolve(data);
      }
    });
  })
}

/**
 * 文件写入，数据会以Json格式保存在文件中
 * @param path 这里使用相对路径，相对于工程目录
 * @param data 需要写入的数据,会转为Json格式保存
 */
function write(path, data) {
  initFS();

  path = formatPath(path);

  return new Promise((resolve, reject) => {
    createDir(path).then((result) => {
      fs.writeFile(path, JSON.stringify(data), (err) => {
        if (err) {
          reject(err);
        } else {
          resolve();
        }
      });
    }).catch((err) => {
      reject(err);
    })
  });
}

/**
 * 格式化路径
 * @param path 路径
 */
function formatPath(path) {
  //去掉0位的'/'
  return path.indexOf('/') === 0 ? path.substring(1) : path;
}

/**
 * 自动创建目录
 * @param path 文件路径
 * @param type 类型，0代表path为文件路径，1代表path为目录路径，默认为0。
 */
function createDir(path, type = 0) {
  initFS();

  let lastIndex = path.lastIndexOf('/');
  let pathDir = type === 0 ? path.substring(0, lastIndex) : path;
  let pathArr = pathDir.split('/');

  /**
   * 递归创建目录
   * @param index 目录路径中'/'的索引
   */
  let createAuto = (index, resolve, reject) => {
    let createPath = pathArr.slice(0, index + 1).join('/');
    //因为recursive熟悉无效，所以需要递归创建
    fs.mkdir(createPath, {recursive: true}, (err) => {
      if (index < pathArr.length - 1) {
        createAuto(++index, resolve, reject);
      } else {
        resolve();
      }
    });
  }

  return new Promise((resolve, reject) => {
    createAuto(0, resolve, reject);
  });
}

module.exports = Tool;